export class TurntableGameAudio {
    private audioCtx: AudioContext
    private frequency: number = 0
    private start: number = 0
    private direction: number = 1
    private arrFrequency: number[] = [196.00, 220.00, 246.94, 261.63, 293.66, 329.63, 349.23, 392.00, 440.00, 493.88, 523.25, 587.33, 659.25, 698.46, 783.99, 880.00, 987.77, 1046.50]

    constructor() {
        this.audioCtx = new AudioContext()
    }

    systemAudio() {
        // 当前频率
        this.frequency = this.arrFrequency[this.start];
        // 如果到头，改变音调的变化规则（增减切换）
        if (!this.frequency) {
            this.direction = -1 * this.direction;
            this.start = this.start + 2 * this.direction;
            this.frequency = this.arrFrequency[this.start];
        }
        // 改变索引，下一次hover时候使用
        this.start = this.start + this.direction;

        // 创建一个OscillatorNode, 它表示一个周期性波形（振荡），基本上来说创造了一个音调
        let oscillator = this.audioCtx.createOscillator();
        // 创建一个GainNode,它可以控制音频的总音量
        let gainNode = this.audioCtx.createGain();
        // 把音量，音调和终节点进行关联
        oscillator.connect(gainNode);
        // audioCtx.destination返回AudioDestinationNode对象，表示当前audio context中所有节点的最终节点，一般表示音频渲染设备
        gainNode.connect(this.audioCtx.destination);
        // 指定音调的类型，其他还有square|triangle|sawtooth
        oscillator.type = 'sine';
        // 设置当前播放声音的频率，也就是最终播放声音的调调
        oscillator.frequency.value = this.frequency;
        // 当前时间设置音量为0
        gainNode.gain.setValueAtTime(0, this.audioCtx.currentTime);
        // 0.01秒后音量为1
        gainNode.gain.linearRampToValueAtTime(1, this.audioCtx.currentTime + 0.01);
        // 音调从当前时间开始播放
        oscillator.start(this.audioCtx.currentTime);
        // 1秒内声音慢慢降低，是个不错的停止声音的方法
        gainNode.gain.exponentialRampToValueAtTime(0.001, this.audioCtx.currentTime + 1);
        // 1秒后完全停止声音
        oscillator.stop(this.audioCtx.currentTime + 1);
    }
}